home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / qed_397 / sourcen / fontsel.c < prev    next >
C/C++ Source or Header  |  1997-01-14  |  8KB  |  367 lines

  1. #include "global.h"
  2. #include "magx.h"
  3. #include "obj.h"
  4. #include "printer.h"
  5. #include "rsc.h"
  6. #include "windows.h"
  7. #include "xfsl.h"
  8. #include "xufsl.h"
  9. #include "fontsel.h"
  10.  
  11. /*
  12.  * exportierte Variablen
  13.  */
  14. FONTINFO    winFont;
  15. FONTINFO    druckFont;
  16. WORD        sys_font_size;
  17. WORD        sys_font_id;
  18. BOOLEAN    extern_fontselect;
  19.  
  20.  
  21. LOCAL WORD set_fsize(WORD handle, WORD f_id, WORD f_size)
  22. {
  23.     UBYTE    size[32];
  24.     WORD    ret;
  25.  
  26.     vst_font(handle, f_id);
  27.     f_size = vst_point (handle, f_size, &ret,&ret,&ret,&ret);
  28.     itoa (f_size, size, 10);
  29.     fill_ptext (fontsel, FGROESSE, size);
  30.     return f_size;
  31. }
  32.  
  33.  
  34. LOCAL WORD next_fsize(WORD handle, WORD f_size)
  35. {
  36.     WORD s, s_neu, s_old, ret;
  37.  
  38.     s = 1000;
  39.     s_old = s_neu = vst_point (handle, s, &ret,&ret,&ret,&ret);
  40.     while (s_neu>f_size)
  41.     {
  42.         s = min(s_neu-1,s-1);
  43.         s_old = s_neu;
  44.         s_neu = vst_point (handle, s, &ret,&ret,&ret,&ret);
  45.     }
  46.     return s_old;
  47. }
  48.  
  49.  
  50. LOCAL WORD prev_fsize(WORD handle, WORD f_size)
  51. {
  52.     WORD s, s_neu, ret;
  53.  
  54.     s = f_size;
  55.     s_neu = vst_point (handle, s, &ret,&ret,&ret,&ret);
  56.     while (s_neu>=f_size)
  57.     {
  58.         s = min(s_neu-1,s-1);
  59.         if (s<=0) return f_size;
  60.         s_neu = vst_point (handle, s, &ret,&ret,&ret,&ret);
  61.     }
  62.     return s_neu;
  63. }
  64.  
  65. BOOLEAN    select_font(WORD handle)
  66. {
  67.     FONTINFO    *font;
  68.     BOOLEAN    show_font;
  69.     WORD        antw, f_id, f_size, f_nr, i, d, ret;
  70.     UBYTE        name[34], *titel;
  71.     DIALINFO    dial;
  72.  
  73.     Arrow_mouse();
  74.     if (handle == vdi_handle)        /* Bildschirmfont? */
  75.     {
  76.         show_font = TRUE;
  77.         font = &winFont;
  78.         titel = STRING(SELWFONTSTR);
  79.     }
  80.     else
  81.     {
  82.         show_font = FALSE;
  83.         font = &druckFont;
  84.         titel = STRING(SELPFONTSTR);
  85.     }
  86.  
  87.     f_id = font->ID;
  88.     f_size = font->Size;
  89.  
  90.     if (extern_fontselect)
  91.     {
  92.         LONG    v;
  93.  
  94.         if (getcookie('xFSL', &v))
  95.         {
  96.             xFSL    *xfsl;
  97.  
  98.             xfsl = (xFSL *)v;
  99.             ret = xfsl->fsl_input(0, (FF_ALL), titel, &f_id, &f_size);
  100.             if (ret == 1)
  101.             {
  102.                 font->ID = f_id;
  103.                 font->Size = f_size;
  104.                 for (d = 1; d <= 100; d++)
  105.                 if (font->ID == vqt_name(handle, d, font->Name))
  106.                 {
  107.                     font->Index = d;
  108.                     break;
  109.                 }
  110.                 return TRUE;
  111.             }
  112.             return FALSE;
  113.         }
  114.         else if (getcookie('UFSL', &v))
  115.         {
  116.             xUFSL_struct    *ufsl;
  117.             ULONG                flags=0xFFFF;
  118.             WORD                attr = 0, color = 1, skew = 0;
  119.             FW_INFO            width={0,0,0};
  120.  
  121.             ufsl = (xUFSL_struct *)v;
  122.             flags = UFS_SIZE_CHANGE|
  123.                       UFS_GDOS_FONTS|
  124.                       UFS_PROP_FONTS;/*|
  125.                       UFS_WIND_DIALOG;*/
  126.  
  127.             if (ufsl->id == xUFS_ID)
  128.             {
  129.                 if ((ufsl->version <= 0x103))
  130.                 {
  131.                     ret = ufsl->font_selexinput(handle, flags, titel,
  132.                                                         "info", 1, 1, &f_id, &f_size,
  133.                                                         &width, &attr, &color, &skew);
  134.                 }
  135.                 else
  136.                 {
  137.                     ret = ufsl->font_selexinput(handle, flags, titel,
  138.                                                          "info", 1, 1, &f_id, &f_size,
  139.                                                          &width, &attr, &color, &skew);
  140.                 }
  141.             }
  142.             else
  143.             {
  144.                 ufsl->dialtyp = UFS_DIALOG;/*WINDOW;*/
  145.                 ret = ufsl->fontsel_input(handle, font->Anz, (flags & UFS_PROP_FONTS) != 0,
  146.                                                   "info", &f_id, &f_size);
  147.             }
  148.             if (ret == UFS_OK)
  149.             {
  150.                 font->ID = f_id;
  151.                 font->Size = f_size;
  152.                 for (d = 1; d <= 100; d++)
  153.                     if (font->ID == vqt_name(handle, d, font->Name))
  154.                     {
  155.                         font->Index = d;
  156.                         break;
  157.                     }
  158.                 return TRUE;
  159.             }
  160.             return FALSE;
  161.         }
  162.         else
  163.         {
  164.             if (note(1, NOUFSL) == 2)
  165.                 return FALSE;
  166.         }
  167.     }
  168.  
  169.     /*
  170.      * Bevor wir den qed-FS benutzen, erst mal nachschauen, ob AES ein FS
  171.      * kann.
  172.      * (Bisher nur MagiC ab V4)
  173.     */
  174.     if (appl_xgetinfo(7, &i, &d, &d, &d) && (i & 0x04) && show_font)
  175.     {
  176.         VOID    *fnt_ptr;
  177.         WORD    check, m4_handle, workout[57];
  178.         LONG    ratio = 1l << 16,
  179.                 id = f_id,
  180.                 size = (LONG) f_size << 16;
  181.  
  182.         /*
  183.          * Da MagiC an der Workstation 'rumfingert, öffnen wir einfach
  184.          * eine neue, nur für die Auswahl!
  185.          */
  186.         m4_handle = open_vwork(workout);
  187.         fnt_ptr = fnts_create(m4_handle, 0, (FNTS_BTMP|FNTS_OUTL|FNTS_MONO|FNTS_PROP),
  188.                                      (FNTS_3D), "The quick brown...", NULL);
  189.  
  190.         ret = fnts_do(fnt_ptr,  FNTS_BSET, id, size, ratio, &check, &id, &size, &ratio);
  191.         fnts_delete(fnt_ptr, 1);
  192.         v_clsvwk(m4_handle);
  193.  
  194.         if (ret == FNTS_OK|| ret == FNTS_SET)
  195.         {
  196.             font->ID = (WORD) id;
  197.             font->Size = (WORD) (size >> 16);
  198.             for (d = 1; d <= 100; d++)
  199.                 if (font->ID == vqt_name(vdi_handle, d, font->Name))
  200.                 {
  201.                     font->Index = d;
  202.                     break;
  203.                 }
  204.             return TRUE;
  205.         }
  206.         return FALSE;
  207.     }
  208.  
  209.  
  210.     /* interner Fontselector */
  211.  
  212.     f_nr = font->Index;
  213.     strcpy(name, font->Name);
  214.     fill_ptext (fontsel, FNAME, name);
  215.     set_fsize(handle, f_id, f_size);
  216.     if (show_font)
  217.         undo_flags(fontsel, FTEST, HIDETREE);
  218.     else
  219.         do_flags(fontsel, FTEST, HIDETREE);
  220.     open_dial(fontsel, FALSE, NULL, &dial);
  221.     dial_draw(&dial);
  222.     do
  223.     {
  224.         if (show_font)
  225.         {
  226.             RECT    s;
  227.  
  228.             objc_rect (fontsel, FTEST, &s, FALSE);        /* Box kann verschoben worden sein */
  229.             Hide_mouse();
  230.             set_clip(TRUE, &s);
  231.             clr_area(&s);
  232.             v_gtext(handle, s.x, s.y, "Test");
  233.             Show_mouse();
  234.         }
  235.         antw = dial_do(&dial, NULL) & 0x7FFF;
  236.         if (antw == FLEFT)
  237.         {
  238.             WORD    i, f_nr_bak;
  239.  
  240.             f_nr_bak = f_nr;
  241.             while (f_nr > 1)
  242.             {
  243.                 f_nr--;
  244.                 i = vqt_name(handle, f_nr, name);
  245.                 if (i >= 0)
  246.                     break;
  247.             }
  248.             if (i >= 0)
  249.             {
  250.                 f_id = i;
  251.                 name[32] = EOS;
  252.                 fill_ptext (fontsel, FNAME, name);
  253.                 draw_Objc(fontsel, FNAME, 1);
  254.                 f_size = set_fsize(handle,f_id,f_size);
  255.                 draw_Objc(fontsel, FGROESSE, 1);
  256.             }
  257.             else
  258.                 f_nr = f_nr_bak;
  259.         }
  260.         else if (antw == FRIGHT)
  261.         {
  262.             WORD    i, f_nr_bak;
  263.  
  264.             f_nr_bak = f_nr;
  265.             while (f_nr <= font->Anz)
  266.             {
  267.                 f_nr++;
  268.                 i = vqt_name(handle, f_nr, name);
  269.                 if (i >= 0)
  270.                     break;
  271.             }
  272.             if (i >= 0)
  273.             {
  274.                 f_id = i;
  275.                 name[32] = EOS;
  276.                 fill_ptext (fontsel, FNAME, name);
  277.                 draw_Objc(fontsel, FNAME, 1);
  278.                 f_size = set_fsize(handle,f_id,f_size);
  279.                 draw_Objc(fontsel, FGROESSE, 1);
  280.             }
  281.             else
  282.                 f_nr = f_nr_bak;
  283.         }
  284.         else if (antw == GLEFT)
  285.         {
  286.             f_size = prev_fsize(handle,f_size);
  287.             f_size = set_fsize(handle,f_id,f_size);
  288.             draw_Objc(fontsel, FGROESSE, 1);
  289.         }
  290.         else if (antw == GRIGHT)
  291.         {
  292.             f_size = next_fsize(handle,f_size);
  293.             f_size = set_fsize(handle,f_id,f_size);
  294.             draw_Objc(fontsel, FGROESSE, 1);
  295.         }
  296.         select_objc(fontsel, antw, FALSE);
  297.         draw_Objc(fontsel, antw, 1);
  298.     }
  299.     while (antw != FOOK && antw != FORAUS);
  300.     dial_end(&dial);
  301.     if (antw == FOOK)
  302.     {
  303.         font->ID = f_id;
  304.         font->Index = f_nr;
  305.         font->Size = f_size;
  306.         strcpy(font->Name, name);
  307.     }
  308.     else        /* alte Werte wieder setzen */
  309.     {
  310.         WORD    ret;
  311.  
  312.         vst_font(handle, font->ID);
  313.         vst_point(handle, font->Size, &ret, &ret, &ret, &ret);
  314.     }
  315.     Last_mouse();
  316.     return (antw == FOOK);
  317. }
  318.  
  319.  
  320. VOID get_systemfont(WORD f_anz)
  321. {
  322.     WORD    d, i;
  323.  
  324.     get_sysfnt(vdi_handle, &sys_font_id, &sys_font_size, &d, &d);
  325.    vst_font (vdi_handle, sys_font_id);
  326.     vst_point(vdi_handle, sys_font_size, &d, &d, &d, &d);
  327.     winFont.ID = sys_font_id;
  328.     for (i = 1; i <= 100; i++)
  329.         if (winFont.ID == vqt_name(vdi_handle, i, winFont.Name))
  330.         {
  331.             winFont.Index = i;
  332.             break;
  333.         }
  334.     winFont.Size = sys_font_size;
  335.     winFont.Anz = f_anz;
  336.     winFont.prop = FALSE;
  337.  
  338.     font_change();
  339. }
  340.  
  341. GLOBAL VOID font_change(VOID)
  342. {
  343.     WORD    i, ret, w1, w2, dummy2, dummy1[5], dummy3[3];
  344.  
  345.     /* gl_wchar und gl_hchar werden NUR hier verändert */
  346.     vst_font(vdi_handle, winFont.ID);
  347.     winFont.Size = vst_point (vdi_handle, winFont.Size, &i, &i, &gl_wchar, &gl_hchar);
  348.  
  349.     for (i = 1; i <= 100; i++)
  350.         if (winFont.ID == vqt_name(vdi_handle, i, winFont.Name))
  351.         {
  352.             winFont.Index = i;
  353.             break;
  354.         }
  355.  
  356.     vqt_width(vdi_handle,'M',&w1,&ret,&ret);
  357.     vqt_width(vdi_handle,'I',&w2,&ret,&ret);
  358.     winFont.prop = (w1 != w2);
  359.  
  360.     vqt_fontinfo(vdi_handle, &min_ascii, &max_ascii, dummy1, &dummy2, dummy3);
  361.     if (min_ascii <= 0)
  362.         min_ascii = 1;
  363.  
  364.     /* Alle Fenster updaten */
  365.     get_all_windows(NIL, SRCH_ANY, do_font_change);
  366. }
  367.